home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Chans / lists / dl_util.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  11.9 KB  |  582 lines

  1. /* dl_util.c: */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Chans/lists/RCS/dl_util.c,v 6.0 1991/12/18 20:10:43 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Chans/lists/RCS/dl_util.c,v 6.0 1991/12/18 20:10:43 jpo Rel $
  9.  *
  10.  * $Log: dl_util.c,v $
  11.  * Revision 6.0  1991/12/18  20:10:43  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "dlist.h"
  19. #include "retcode.h"
  20. #include "adr.h"
  21. #include "or.h"
  22. #include <isode/quipu/attrvalue.h>
  23.  
  24. extern AttributeType at_Member;
  25. extern AttributeType at_Owner;
  26. extern AttributeType at_Permit;
  27. extern AttributeType at_Policy;
  28. extern AttributeType at_ORAddress;
  29. extern AttributeType at_RFC822;
  30. extern AttributeType at_RoleOccupant;
  31. extern OID dl_oc;
  32.  
  33. extern OR_ptr orAddr_parse ();
  34.  
  35. Attr_Sequence current_print = NULLATTR;
  36.  
  37. extern LLog * log_dsap;
  38.  
  39. ORName * addr2orname (addr)
  40. ADDR * addr;
  41. {
  42. ORName * or;
  43. OR_ptr por = NULLOR;
  44.  
  45.     or = (ORName *) smalloc (sizeof (ORName));
  46.     or->on_dn = NULLDN;
  47.     or->on_or = NULLOR;
  48.  
  49.     if (addr->ad_dn)
  50.         or->on_dn = str2dn (addr->ad_dn);
  51.  
  52.     if (addr->ad_value) {
  53.         
  54.         if (addr->ad_r822adr)
  55.             or_rfc2or(addr->ad_r822adr,&por);
  56.         else
  57.             por = or_std2or(addr->ad_value);
  58.         
  59.         if (por)
  60.             or->on_or = or_default(por);
  61.     }
  62.  
  63.     return (or);
  64. }
  65.  
  66.  
  67. OR_ptr as2or (as)
  68. Attr_Sequence as;
  69. {
  70. Attr_Sequence tmp;
  71. OR_ptr or_cpy ();
  72.  
  73.     if ((tmp = as_find_type(as,at_ORAddress)) != NULLATTR) 
  74.         if (tmp->attr_value)
  75.             return (or_cpy ((OR_ptr) tmp->attr_value->avseq_av.av_struct));
  76.     if ((tmp = as_find_type(as,at_RFC822)) != NULLATTR) {
  77.         OR_ptr or;
  78.         if (tmp->attr_value)
  79.             if (or_rfc2or((char *)tmp->attr_value->avseq_av.av_struct,&or) == OK)
  80.                 return (or);
  81.     }
  82.  
  83.     return NULLOR;
  84. }
  85.  
  86. avs_seq_print (ps,avs,format) 
  87. PS   ps;
  88. AV_Sequence  avs;
  89. int  format;
  90. {
  91. AV_Sequence eptr;
  92.  
  93.     for(eptr = avs; eptr != NULLAV; eptr = eptr->avseq_next) {
  94.         ps_print (ps,"  ");
  95.         AttrV_print (ps,&eptr->avseq_av,format);
  96.         ps_print (ps,"\n");
  97.     }
  98. }
  99.  
  100. static int member_compar (a, b)
  101. AV_Sequence *a, *b;
  102. {
  103.     ORName  * aor = (ORName *)((*a)->avseq_av.av_struct);
  104.     ORName  * bor = (ORName *)((*b)->avseq_av.av_struct);
  105.  
  106.     return orName_cmp (aor,bor);
  107.  
  108. }
  109.  
  110. static avs_seq_print_members (ps,avs) 
  111. PS   ps;
  112. AV_Sequence  *avs;
  113. {
  114. AV_Sequence eptr;
  115. int i=0;
  116. DN tdn, marker, next, trail = NULLDN;
  117. extern char * local_dit;
  118. ORName * or;
  119.  
  120.     marker = str2dn (local_dit);
  121.  
  122.     for(eptr = *avs; eptr != NULLAV; eptr = eptr->avseq_next) {
  123.         i++;
  124.         or = (ORName *)eptr->avseq_av.av_struct;
  125.         if ((tdn = or->on_dn) != NULLDN) {
  126.             for (next=marker; 
  127.                 (tdn!= NULLDN) && (next != NULLDN); 
  128.                 next=next->dn_parent, tdn=tdn->dn_parent) {
  129.                 if (dn_comp_cmp(tdn,next) != 0) {
  130.                     if (trail == NULLDN) 
  131.                         marker = NULLDN;
  132.                     else 
  133.                         trail->dn_parent = NULLDN;
  134.                     dn_free (next);
  135.                     break;
  136.                 }
  137.                 trail = next;
  138.             }
  139.             if (tdn == NULLDN) {
  140.                 if (trail == NULLDN) 
  141.                     marker = NULLDN;
  142.                 else 
  143.                     trail->dn_parent = NULLDN;
  144.                 dn_free (next);
  145.             }
  146.         }
  147.     }
  148.  
  149.     if (i>1) {
  150.  
  151.         AV_Sequence *base, *bp, *ep;
  152.  
  153.         base = (AV_Sequence *) smalloc ((int)i * sizeof *base);
  154.         ep = base;
  155.         for(eptr = *avs; eptr != NULLAV; eptr = eptr->avseq_next) 
  156.             *ep++ = eptr;
  157.         
  158.         qsort ((char *) base, i, sizeof *base, (IFP) member_compar);
  159.  
  160.         bp = base;
  161.         eptr = *avs = *bp++;
  162.         while (bp < ep) {
  163.             eptr -> avseq_next = *bp;
  164.             eptr = *bp++;
  165.             }
  166.         eptr -> avseq_next = NULL;
  167.         free ((char *) base);
  168.     }
  169.  
  170.     i = 1;
  171.  
  172.     for(eptr = *avs; eptr != NULLAV; eptr = eptr->avseq_next) {
  173.         ps_printf (ps,"%2d: ",i++);
  174.         or = (ORName *)eptr->avseq_av.av_struct;
  175.         if (or->on_dn != NULLDN) 
  176. #ifdef MULTILINE_OUTPUT
  177.             (void) ufn_dn_print_aux (ps,or->on_dn,marker,TRUE);
  178. #else
  179.             (void) ufn_dn_print_aux (ps,or->on_dn,marker,FALSE);
  180. #endif
  181.         else {
  182.             ps_print (ps,"X.400 Address: ");
  183.             orAddr_print (ps,or->on_or,READOUT);
  184.         }
  185.         ps_print (ps,"\n");
  186.     }
  187. }
  188.  
  189. check_ORName (ps,or,dncheck,orcheck,update,listname,quiet)
  190. PS ps;
  191. ORName * or;
  192. char dncheck;
  193. char orcheck;
  194. char update;
  195. DN listname;
  196. char quiet;
  197. {
  198. OR_ptr newor = NULLOR; 
  199. char buf [LINESIZE];
  200. Attr_Sequence as;
  201. char ret = TRUE;
  202. char res;
  203.  
  204.     if (update)
  205.         dncheck = TRUE;
  206.  
  207.     if (dncheck && (or->on_dn != NULLDN)) {
  208.         if (!quiet) {
  209.           ps_print (ps,"Checking '");
  210.           ufn_dn_print (ps,or->on_dn,FALSE);
  211.           ps_print (ps,"'... ");
  212.           (void) ps_flush (ps);
  213.             }
  214.  
  215.         if ((res = dn2addr (or->on_dn, &as)) == OK)
  216.             newor = as2or (as);
  217.  
  218.         if (newor == NULLOR) {
  219.             if (quiet) {
  220.                 if (res == NOTOK) {
  221.                    ps_print (ps,"\n ORAddress lookup failed '");
  222.                    ufn_dn_print (ps,or->on_dn,FALSE);
  223.                    ps_print (ps,"'");
  224.                    ret = FALSE;
  225.                     }
  226.             } else if (res == DONE) 
  227.                 ps_print (ps,"\n *** Temporary ORAddress lookup failed ***\n");
  228.             else {
  229.                 ps_print (ps,"\n *** ORAddress lookup failed ***\n");
  230.                     ret = FALSE;
  231.                 }
  232.         } else if (orAddr_cmp (newor, or->on_or) == 0) {
  233.             if (!quiet)
  234.               ps_print (ps,"OK\n");
  235.         } else if (update) {    
  236.  
  237.             if (orAddr_check (newor,&buf[0]) == OK) {
  238.                 if (or->on_or == NULLOR) {
  239.                     ps_print (ps,"\n   Adding ORaddress ");
  240.                 } else {
  241.                     ps_print (ps,"\n   Changing ");
  242.                     orAddr_print (ps,or->on_or,READOUT);
  243.                     ps_print (ps," to ");
  244.                 }
  245.                 orAddr_print (ps,newor,READOUT);
  246.                 ps_print (ps,"... ");
  247.                 (void) ps_flush (ps);
  248.  
  249.                 if (or_modify (ps,or,newor,at_Member,listname)) {
  250.                     ps_print (ps,"OK\n");
  251.                     or_free (or->on_or);
  252.                     or->on_or = newor;
  253.                 }
  254.                 (void) ps_flush (ps);
  255.                 return ret;
  256.             } else {
  257.                 char buf2[BUFSIZ];
  258.                 or_or2std (newor,buf2,0);
  259.                 ps_printf (ps,"\n *** BAD ORAddress in DIT (%s): %s *** \n",buf,buf2);
  260.                 ret = FALSE;
  261.             }
  262.         } else if (orcheck && or->on_or != NULLOR) {
  263.             if (orAddr_check (newor,&buf[0]) == OK) {
  264.                 if (quiet) {
  265.                     ps_printf (ps,"\n Error: '%s'\n   X.500: ",dn2ufn(or->on_dn,FALSE));
  266.                 } else
  267.                     ps_print (ps,"\n *** Error ***\n   X.500: ");
  268.                 orAddr_print (ps,newor,EDBOUT);
  269.                 ps_print (ps,"\n   X.400: ");
  270.                 orAddr_print (ps,or->on_or,EDBOUT);
  271.                 ps_print (ps,"\n");
  272.                 ret = FALSE;
  273.             } else {
  274.                 char buf2[BUFSIZ];
  275.                 or_or2std (newor,buf2,0);
  276.                 ps_printf (ps,"\n *** BAD ORAddress in DIT (%s): %s ***\n",buf,buf2);
  277.                 ret = FALSE;
  278.             }
  279.         } else {
  280.             if (!quiet)
  281.                ps_print (ps,"X.500 Name OK\n");
  282.             if (or->on_or == NULLOR)
  283.                 or->on_or = newor;
  284.         }
  285.     }
  286.  
  287.     if ((orcheck) && (or->on_or != NULLOR)) {
  288.         if (!quiet) {
  289.             ps_print (ps,"Checking ");
  290.             orAddr_print (ps,or->on_or,READOUT);
  291.             ps_print (ps,"... ");
  292.         }
  293.  
  294.         if (orAddr_check (or->on_or,&buf[0]) == OK) {
  295.             if (!quiet)
  296.                 ps_printf (ps,"OK\n");
  297.         } else {
  298.             if (quiet) {
  299.                 ps_printf (ps,"\n Error: %s \n",buf);
  300.                 orAddr_print (ps,or->on_or,READOUT);
  301.                 ps_print (ps,"\n");
  302.             } else
  303.                 ps_printf (ps,"\n *** Error: %s *** \n",buf);
  304.             ret = FALSE;
  305.         }
  306.     }
  307.     (void) ps_flush (ps);
  308.     return ret;
  309. }
  310.  
  311. check_dl_members (ps,dn,as,dncheck,orcheck,update,quiet)
  312. PS ps;
  313. DN dn;
  314. Attr_Sequence as;
  315. char dncheck;
  316. char orcheck;
  317. char update;
  318. char quiet;
  319. {
  320. Attr_Sequence tmp;
  321. AV_Sequence avs;
  322. int res;
  323. int result = OK;
  324.  
  325.     if ((tmp = as_find_type (as,at_Member)) == NULLATTR) {
  326.         ps_print (ps,"Can't find dl-members attribute!!!\n");
  327.         return NOTOK;
  328.     }
  329.  
  330.     for (avs=tmp->attr_value; avs!= NULLAV; avs=avs->avseq_next) {
  331.         res = check_ORName (ps,(ORName *)avs->avseq_av.av_struct,
  332.                     dncheck,orcheck,update,dn,quiet);
  333.         if (res == FALSE)
  334.             result = NOTOK;
  335.     }
  336.  
  337.     return result;
  338. }
  339.  
  340. dl_print (ps,dn)
  341. PS ps;
  342. DN dn;
  343. {
  344. Attr_Sequence tmp;
  345. Attr_Sequence as;
  346. DN dnm, get_manager_dn();
  347.  
  348.     switch (dir_getdl_aux (dn, &as)) {
  349.         case OK:
  350.         break;
  351.         case DONE:
  352.         ps_print (ps, "Temporary failure to read the entry");
  353.         return;
  354.         default:
  355.         ps_print (ps,"Can't read the entry");        
  356.         return;
  357.     }
  358.  
  359.     current_print = as;
  360.  
  361.     if (( dnm = get_manager_dn(as,TRUE)) == NULLDN) 
  362.         ps_print (ps,"\nEntry has no Owner !!!\n");
  363.     else {
  364.         ps_print (ps,"\nOwner: ");
  365.         ufn_dn_print (ps,dnm,TRUE);
  366.     }
  367.  
  368.     if (((tmp = as_find_type (as,at_Permit)) == NULLATTR) 
  369.         || (tmp->attr_value == NULLAV))
  370.         ps_print (ps,"\n\nEntry has no mhsDLSubmitPermissions !!!\n");
  371.     else {
  372.         ps_print (ps,"\n\nSubmit Permissions, ");
  373.         avs_seq_print (ps,tmp->attr_value, UFNOUT);
  374.     }
  375.  
  376.     if (((tmp = as_find_type (as,at_Policy)) == NULLATTR) 
  377.         || (tmp->attr_value == NULLAV))
  378.         ps_print (ps,"\nEntry has no dl-policy\n");
  379.     else {
  380.         ps_print (ps,"\nList Policy, ");
  381.         avs_seq_print (ps,tmp->attr_value, UFNOUT);
  382.     }
  383.  
  384.     if ((tmp = as_find_type (as,at_Member)) == NULLATTR) {
  385.         ps_print (ps,"\nEntry has no dl-members !!!\n");
  386.         return;
  387.     }
  388.     ps_print (ps,"\nMembers:\n");
  389.     avs_seq_print_members (ps,&tmp->attr_value);
  390.  
  391. }
  392.  
  393.  
  394. ADDR * get_postmaster()
  395. {
  396. static ADDR *res = NULLADDR;
  397. ADDR *dn2ADDR();
  398. DN dn, search_postmaster();
  399. static DN localdn = NULLDN;
  400. extern char * local_dit;
  401. extern char * getpostmaster();
  402.  
  403.     if (res != NULLADDR)
  404.         return res;
  405.  
  406.     if ((localdn == NULLDN) && local_dit)
  407.         localdn = str2dn (local_dit);
  408.  
  409.     if ((dn = search_postmaster(localdn)) == NULLDN) 
  410.         return res = adr_new(getpostmaster(AD_822_TYPE), 
  411.                      AD_822_TYPE, 0);
  412.  
  413.     if ((res = dn2ADDR (dn,TRUE)) == NULLADDR)
  414.         return res = adr_new(getpostmaster(AD_822_TYPE), 
  415.                      AD_822_TYPE, 0);
  416.  
  417.     return res;
  418. }
  419.  
  420. char * get_spostmaster()
  421. {
  422. ADDR *res;
  423.  
  424.     res = get_postmaster();
  425.     return res->ad_value;
  426. }
  427.  
  428.  
  429. ADDR * get_manager(as)
  430. Attr_Sequence as;
  431. {
  432. Attr_Sequence tmp;
  433. AV_Sequence avs;
  434. ADDR * dn2ADDR();
  435. ADDR     *ret = NULLADDR;
  436. ADDR    *next;
  437. int num = 1;
  438. int dn_print ();
  439.  
  440.     if ((tmp = as_find_type(as,at_Owner)) == NULLATTR)
  441.         return get_postmaster();
  442.  
  443.     if ((avs = tmp->attr_value) == NULLAV)
  444.         return get_postmaster();
  445.  
  446.     for (; avs!= NULLAV; avs=avs->avseq_next) {
  447.         if ((next = dn2ADDR ((DN)(avs->avseq_av.av_struct),TRUE)) == NULLADDR) {
  448.             pslog (log_dsap,LLOG_NOTICE,"Bad address in DN",dn_print,avs->avseq_av.av_struct);
  449.             continue;
  450.         }
  451.         next->ad_extension = num;
  452.         next->ad_no = num++;
  453.         adr_add(&ret, next);
  454.     }
  455.     return ret;
  456. }
  457.  
  458. DN get_manager_dn (as,unwrap)
  459. Attr_Sequence as;
  460. char unwrap;        /* IF TRUE, and entry is a role, unwrap it */
  461. {
  462. Attr_Sequence tmp;
  463. AV_Sequence avs;
  464.  
  465.     if ((tmp = as_find_type(as,at_Owner)) == NULLATTR)
  466.         return NULLDN;
  467.  
  468.     if ((avs = tmp->attr_value) == NULLAV)
  469.         return NULLDN;
  470.  
  471.     if (unwrap) {
  472.         if (dn2addr((DN)avs->avseq_av.av_struct, &tmp) != OK)
  473.             return (DN)avs->avseq_av.av_struct;
  474.  
  475.         if ((tmp = as_find_type (tmp,at_RoleOccupant)) == NULLATTR) 
  476.             return (DN)avs->avseq_av.av_struct;
  477.     
  478.         if ((tmp->attr_value) == NULLAV)
  479.             return (DN)avs->avseq_av.av_struct;
  480.         avs = tmp->attr_value;
  481.     }
  482.  
  483.     return (DN)avs->avseq_av.av_struct;
  484. }
  485.  
  486.  
  487. DN mail2dn (ps,addr)
  488. PS ps;
  489. char * addr;
  490. {
  491. DN dn, do_dm_match();
  492. ADDR * ad;
  493. char *local, *ad_getlocal();
  494. RP_Buf rp;
  495.  
  496.     ps_printf (ps,"Looking for mail address '%s' in the directory...",addr);
  497.  
  498.     ad = adr_new (addr, (*addr == '/') ? AD_X400_TYPE : AD_822_TYPE, 1);
  499.     ad->ad_resp = YES;
  500.  
  501. #ifdef UKORDER
  502.     (void) ad_parse(ad, &rp, CH_UK_PREF);
  503. #else
  504.     (void) ad_parse(ad, &rp, CH_USA_PREF);
  505. #endif
  506.     if (ad->ad_r400adr == NULLCP) {
  507.         adr_free (ad);
  508.         ps_printf (ps,"Failed\n",addr);
  509.         return NULLDN;
  510.     }
  511.  
  512.     if ((local = ad_getlocal (ad->ad_r400adr, AD_X400_TYPE)) == NULLCP) {
  513.         if (ad->ad_r822adr)
  514.             dn = do_dm_match (ad->ad_r822adr);
  515.         else
  516.             dn = do_dm_match (addr);
  517.  
  518.         if (dn) {
  519.             adr_free (ad);
  520.             ps_printf (ps,"%s\n", dn2ufn(dn,FALSE));
  521.             return dn;       
  522.         } else {
  523.             adr_free (ad);
  524.             ps_printf (ps,"Failed\n",addr);
  525.             return NULLDN;
  526.         }
  527.     }
  528.  
  529.     dn = do_dm_match (local);
  530.  
  531.     free (local);
  532.     adr_free (ad);
  533.  
  534.     ps_printf (ps,"%s\n", dn2ufn(dn,FALSE));
  535.     
  536.     return dn;       
  537. }
  538.  
  539. ORName * mail2orname (ps,addr)
  540. PS ps;
  541. char * addr;
  542. {
  543. ORName * or;
  544. char * ptr;
  545. Attr_Sequence as;
  546. OR_ptr as2or (), orAddr_parse_user();
  547.  
  548.     or = (ORName *) smalloc (sizeof (ORName));
  549.  
  550.     if ((or->on_dn = mail2dn(ps,addr)) == NULLDN) {
  551.         ptr = SkipSpace(addr);    
  552.         if (*ptr == 0)
  553.             or->on_or = NULLOR;
  554.         else if ((or->on_or = orAddr_parse (ptr)) == NULLOR)
  555.             return (NULLORName);
  556.     } else {
  557.         if (dn2addr (or->on_dn, &as) != OK) 
  558.             or->on_or = orAddr_parse (addr);
  559.         else
  560.             or->on_or = as2or (as);
  561.     }
  562.  
  563.     return (or);
  564. }
  565.  
  566. Attr_Sequence mail2member (ps, addr)
  567. PS ps;
  568. char * addr;
  569. {
  570. AttributeValue av;
  571. AV_Sequence avs;
  572.  
  573.     av = AttrV_alloc();
  574.     av->av_syntax = str2syntax("ORName");
  575.     if ((av->av_struct = (caddr_t) mail2orname(ps,addr)) == NULL)
  576.         return NULLATTR;
  577.  
  578.     avs = avs_comp_new(av);
  579.     return as_comp_new (AttrT_cpy(at_Member),avs,NULLACL_INFO);
  580. }
  581.  
  582.